🎖️GitЯра🎖️
scripts/check-doc-coverage.js docs/obtainium-generated-deeplinks (42f311dd) Text, 3.21 KB
T8b949e#!/usr/bin/env node
T8b949e// scripts/check-doc-coverage.js
T8b949e// Checks that each user-facing feature module has corresponding documentation.
T8b949e// Exit 0 = full coverage, Exit 1 = gaps found.
T8b949e//
T8b949e// Usage: node scripts/check-doc-coverage.js [repo-root]
Ta5d6ff"use strict"Tb4b4b4;
Tff7b72const Te6edf3fs Tff7b72= Te6edf3requireTb4b4b4(Ta5d6ff"fs"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3path Tff7b72= Te6edf3requireTb4b4b4(Ta5d6ff"path"Tb4b4b4)Tb4b4b4;
Tff7b72const Tb4b4b4{ Te6edf3forEachDocPage Tb4b4b4} Tff7b72= Te6edf3requireTb4b4b4(Ta5d6ff"./lib/frontmatter"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3REPO_ROOT Tff7b72= Te6edf3pathTb4b4b4.Te6edf3resolveTb4b4b4(Te6edf3processTb4b4b4.Te6edf3argvTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72|| Ta5d6ff"."Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3DOCS_DIR Tff7b72= Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3REPO_ROOTTb4b4b4, Ta5d6ff"docs"Tb4b4b4, Ta5d6ff"en"Tb4b4b4)Tb4b4b4;
T8b949e// Map of feature module directory names to expected doc page slugs.
T8b949e// Modules not listed here are considered internal (no user-facing docs required).
Tff7b72const Te6edf3MODULE_TO_DOCS Tff7b72= Tb4b4b4{
Ta5d6ff"feature/connections"Tff7b72: Tb4b4b4{ Te6edf3pagesTff7b72: Tb4b4b4[Ta5d6ff"connections"Tb4b4b4]Tb4b4b4, Te6edf3sectionTff7b72: Ta5d6ff"user" Tb4b4b4}Tb4b4b4,
Ta5d6ff"feature/discovery"Tff7b72: Tb4b4b4{ Te6edf3pagesTff7b72: Tb4b4b4[Ta5d6ff"discovery"Tb4b4b4]Tb4b4b4, Te6edf3sectionTff7b72: Ta5d6ff"user" Tb4b4b4}Tb4b4b4,
Ta5d6ff"feature/docs"Tff7b72: Tb4b4b4{ Te6edf3pagesTff7b72: Tb4b4b4[Tb4b4b4]Tb4b4b4, Te6edf3sectionTff7b72: Ta5d6ff"user"Tb4b4b4, Te6edf3internalTff7b72: Tff7b72true Tb4b4b4}Tb4b4b4,
Ta5d6ff"feature/firmware"Tff7b72: Tb4b4b4{ Te6edf3pagesTff7b72: Tb4b4b4[Ta5d6ff"firmware"Tb4b4b4]Tb4b4b4, Te6edf3sectionTff7b72: Ta5d6ff"user" Tb4b4b4}Tb4b4b4,
Ta5d6ff"feature/intro"Tff7b72: Tb4b4b4{ Te6edf3pagesTff7b72: Tb4b4b4[Ta5d6ff"onboarding"Tb4b4b4]Tb4b4b4, Te6edf3sectionTff7b72: Ta5d6ff"user" Tb4b4b4}Tb4b4b4,
Ta5d6ff"feature/map"Tff7b72: Tb4b4b4{ Te6edf3pagesTff7b72: Tb4b4b4[Ta5d6ff"map-and-waypoints"Tb4b4b4]Tb4b4b4, Te6edf3sectionTff7b72: Ta5d6ff"user" Tb4b4b4}Tb4b4b4,
Ta5d6ff"feature/messaging"Tff7b72: Tb4b4b4{ Te6edf3pagesTff7b72: Tb4b4b4[Ta5d6ff"messages-and-channels"Tb4b4b4]Tb4b4b4, Te6edf3sectionTff7b72: Ta5d6ff"user" Tb4b4b4}Tb4b4b4,
Ta5d6ff"feature/node"Tff7b72: Tb4b4b4{ Te6edf3pagesTff7b72: Tb4b4b4[Ta5d6ff"nodes"Tb4b4b4, Ta5d6ff"node-metrics"Tb4b4b4]Tb4b4b4, Te6edf3sectionTff7b72: Ta5d6ff"user" Tb4b4b4}Tb4b4b4,
Ta5d6ff"feature/settings"Tff7b72: Tb4b4b4{ Te6edf3pagesTff7b72: Tb4b4b4[Ta5d6ff"settings-radio-user"Tb4b4b4, Ta5d6ff"settings-module-admin"Tb4b4b4]Tb4b4b4, Te6edf3sectionTff7b72: Ta5d6ff"user" Tb4b4b4}Tb4b4b4,
Ta5d6ff"feature/telemetry"Tff7b72: Tb4b4b4{ Te6edf3pagesTff7b72: Tb4b4b4[Ta5d6ff"telemetry-and-sensors"Tb4b4b4]Tb4b4b4, Te6edf3sectionTff7b72: Ta5d6ff"user" Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4;
T8b949e// Collect existing doc pages
Tff7b72const Te6edf3existingPages Tff7b72= Tff7b72new Tffa657SetTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3forEachDocPageTb4b4b4(Te6edf3DOCS_DIRTb4b4b4, Tb4b4b4(Te6edf3_filePathTb4b4b4, Te6edf3slugTb4b4b4, Te6edf3sectionTb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3existingPagesTb4b4b4.Te6edf3addTb4b4b4(Ta5d6ff`Tffd700${Te6edf3sectionTffd700}Ta5d6ff/Tffd700${Te6edf3slugTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff`Ta5d6ffChecking doc coverage for Tffd700${Tffa657ObjectTb4b4b4.Te6edf3keysTb4b4b4(Te6edf3MODULE_TO_DOCSTb4b4b4)Tb4b4b4.Te6edf3lengthTffd700}Ta5d6ff feature modules...Ta5d6ff`Tb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff`Ta5d6ffFound Tffd700${Te6edf3existingPagesTb4b4b4.Te6edf3sizeTffd700}Ta5d6ff doc pages.Ta5d6ff`Tb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff""Tb4b4b4)Tb4b4b4;
Tff7b72let Te6edf3gaps Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Tb4b4b4[Te6edf3moduleTb4b4b4, Te6edf3configTb4b4b4] Tff7b72of Tffa657ObjectTb4b4b4.Te6edf3entriesTb4b4b4(Te6edf3MODULE_TO_DOCSTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3configTb4b4b4.Te6edf3internalTb4b4b4) Tff7b72continueTb4b4b4;
Tff7b72const Te6edf3moduleDir Tff7b72= Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3REPO_ROOTTb4b4b4, Te6edf3moduleTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3fsTb4b4b4.Te6edf3existsSyncTb4b4b4(Te6edf3moduleDirTb4b4b4)Tb4b4b4) Tff7b72continueTb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3page Tff7b72of Te6edf3configTb4b4b4.Te6edf3pagesTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3key Tff7b72= Ta5d6ff`Tffd700${Te6edf3configTb4b4b4.Te6edf3sectionTffd700}Ta5d6ff/Tffd700${Te6edf3pageTffd700}Ta5d6ff`Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3existingPagesTb4b4b4.Te6edf3hasTb4b4b4(Te6edf3keyTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff`Ta5d6ff ✗ Tffd700${Te6edf3moduleTffd700}Ta5d6ff → missing Tffd700${Te6edf3keyTffd700}Ta5d6ff.mdTa5d6ff`Tb4b4b4)Tb4b4b4;
Te6edf3gapsTff7b72++Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
T8b949e// Also check for doc pages that reference non-existent modules (orphans)
Tff7b72const Te6edf3documentedModules Tff7b72= Tff7b72new Tffa657SetTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3config Tff7b72of Tffa657ObjectTb4b4b4.Te6edf3valuesTb4b4b4(Te6edf3MODULE_TO_DOCSTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3page Tff7b72of Te6edf3configTb4b4b4.Te6edf3pagesTb4b4b4) Tb4b4b4{
Te6edf3documentedModulesTb4b4b4.Te6edf3addTb4b4b4(Ta5d6ff`Tffd700${Te6edf3configTb4b4b4.Te6edf3sectionTffd700}Ta5d6ff/Tffd700${Te6edf3pageTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
T8b949e// Report coverage summary
Tff7b72const Te6edf3coveredModules Tff7b72= Tffa657ObjectTb4b4b4.Te6edf3entriesTb4b4b4(Te6edf3MODULE_TO_DOCSTb4b4b4)
Tb4b4b4.Te6edf3filterTb4b4b4(Tb4b4b4(Tb4b4b4[Tb4b4b4, Te6edf3cTb4b4b4]Tb4b4b4) Tb4b4b4=> Tff7b72!Te6edf3cTb4b4b4.Te6edf3internalTb4b4b4)
Tb4b4b4.Te6edf3filterTb4b4b4(Tb4b4b4(Tb4b4b4[Te6edf3mTb4b4b4]Tb4b4b4) Tb4b4b4=> Te6edf3fsTb4b4b4.Te6edf3existsSyncTb4b4b4(Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3REPO_ROOTTb4b4b4, Te6edf3mTb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3totalExpected Tff7b72= Te6edf3coveredModulesTb4b4b4.Te6edf3reduceTb4b4b4(Tb4b4b4(Te6edf3sumTb4b4b4, Tb4b4b4[Tb4b4b4, Te6edf3cTb4b4b4]Tb4b4b4) Tb4b4b4=> Te6edf3sum Tff7b72+ Te6edf3cTb4b4b4.Te6edf3pagesTb4b4b4.Te6edf3lengthTb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3covered Tff7b72= Te6edf3totalExpected Tff7b72- Te6edf3gapsTb4b4b4;
Tff7b72const Te6edf3pct Tff7b72= Te6edf3totalExpected Tff7b72> T79c0ff0 Tff7b72? Tffa657MathTb4b4b4.Te6edf3roundTb4b4b4(Tb4b4b4(Te6edf3covered Tff7b72/ Te6edf3totalExpectedTb4b4b4) Tff7b72* T79c0ff100Tb4b4b4) Tff7b72: T79c0ff100Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff""Tb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff`Ta5d6ffCoverage: Tffd700${Te6edf3coveredTffd700}Ta5d6ff/Tffd700${Te6edf3totalExpectedTffd700}Ta5d6ff required pages present (Tffd700${Te6edf3pctTffd700}Ta5d6ff%)Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3gaps Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff`Ta5d6ff\nTffd700${Te6edf3gapsTffd700}Ta5d6ff documentation gap(s) found.Ta5d6ff`Tb4b4b4)Tb4b4b4;
Te6edf3processTb4b4b4.Te6edf3exitTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"All feature modules have documentation coverage."Tb4b4b4)Tb4b4b4;
Te6edf3processTb4b4b4.Te6edf3exitTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Served by rngit 1.4.2 - Generated in 0.07s